package libra;

import java.net.URI;
import java.util.List;
import java.util.Map;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.context.ConfigurableApplicationContext;

import com.fasterxml.jackson.databind.ObjectMapper;

@SpringBootApplication
public class MainEntry {
	public static final String dataId = "GatewayDynamicRouter.yml";
	
	public static void main(String[] args) throws Exception {
		/*
		 * 启动Spring应用，返回一个ConfigurableApplicationContext的context对象，可以像原来一样从里面通过getbean等方法，获取对象
		 * run()传入的类，一定要是个用@SpringBootApplication注解标注的类，被@SpringBootApplication标注的类被解释为SpringBoot的主配置类。
		 * 当程序执行时，就应该运行该类的main方法来启动SpringBoot应用。
		 */
		ConfigurableApplicationContext cac = org.springframework.boot.SpringApplication.run(MainEntry.class, args);
		
		/********************************************************************************
		 * 通过PredicateDefinition构造Actuator_Gateway监管中添加路由接口所需的路由信息结构 *
		 ********************************************************************************/
		/*
		 * 构建Predicate断言
		 */
		// 方式一、通过setXXX()方法进行设置
		PredicateDefinition predicateDefinition = new PredicateDefinition();
		predicateDefinition.setName("Path");
		predicateDefinition.setArgs( Map.of("patterns","/add/*") );
		// 方式二、通过构造函数进行设置，遵守简写规范(多个参数值之间使用','分隔)
//		PredicateDefinition predicateDefinition = new PredicateDefinition("Path=/add/*");
		/*
		 * 构建Filter过滤
		 */
		// 方式一、通过setXXX()方法进行设置
//		FilterDefinition filterDefinition = new FilterDefinition();
//		filterDefinition.setName("StripPrefix");
//		filterDefinition.setArgs( Map.of("parts","1") );
		// 方式二、通过构造函数进行设置，遵守简写规范(多个参数值之间使用','分隔)
		FilterDefinition filterDefinition = new FilterDefinition("StripPrefix=1");
		
		/*
		 * 构建RouteDefinition
		 */
		RouteDefinition routeDefinition = new RouteDefinition();
		// 设置RouteID，非必须项，API接口会将/actuator/gateway/routes/{route_id}赋值给Id
		routeDefinition.setId("add");
		// 设置路由的uri
		routeDefinition.setUri(URI.create("http://127.0.0.1:8080"));
		// 设置路由Predicate断言
		routeDefinition.setPredicates( List.of( predicateDefinition ) );
		// 设置路由Filter过滤
		routeDefinition.setFilters( List.of(filterDefinition) );
		
		System.out.println( new ObjectMapper().writeValueAsString(routeDefinition) );
	}
}
